import axios from 'axios'
import QS from 'qs' // 引入qs模块，用来序列化post类型的数据，后面会提到
import store from '@/store'
/**
 * axios请求封装
 * 请求拦截，响应拦截，错误处理
 */

// 环境切换
if (process.env.NODE_ENV == 'development') {
  axios.defaults.baseURL = 'https://elm.cangdu.org/'
} else if (process.env.NODE_ENV == 'debug') {
  axios.defaults.baseURL = ''
} else if (process.env.NODE_ENV == 'production') {
  axios.defaults.baseURL = 'https://elm.cangdu.org/'
}

// 请求超时
axios.defaults.timeout = 10000

// post请求头
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencodedcharset=UTF-8'

// 请求拦截器
axios.interceptors.request.use(
  config => {
    // 每次发送请求之前判断是否存在token，如果存在，则统一在http请求的header都加上token，不用每次请求都手动添加了
    // 即使本地存在token，也有可能token是过期的，所以在响应拦截器中要对返回状态进行判断
    const token = store.getters.token
    token && (config.headers.Authorization = token)
    return config
  },
  error => {
    return Promise.error(error)
})

// 响应拦截
axios.interceptors.response.use(
  response => {
    if(response.status === 200) {
      return Promise.resolve(response)
    } else {
      return Promise.reject(response)
    }
  },
  // 状态码不是200的情况下
  error => {
    if(error.response.status) {
      switch(error.response.status) {
        case 401: 
          alert('未登录')
          break
        case 403:
          alert('token过期')
          break
        case 404:
          alert('请求资源不存在')
          break
        default:
          alert(error.response.data.message)
      }
      return Promise.reject(error.response)
    }
  }
)
/**
 * get方法
 * @param {string} url [请求的地址] 
 * @param {object} params [请求携带的参数]
 */
export function get (url, params) {
  return new Promise ((resolve, reject) => {
    axios.get(url, {params: params})
    .then(res=> {
      resolve(res.data)
    })
    .catch(err=> {
      reject(err.data)
    })
  })
}

/**
 * post方法
 * @param {string} url 
 * @param {Object} params 
 */
export function post (url, params) {
  return new Promise((resolve, reject) => {
    axios.post(url, QS.stringify(params))
    .then(res => {
      resolve(res.data)
    })
    .catch(err => {
      reject(err.data)
    })
  })
}

 /**
  * 导出请求方法
  * @param {string} url [请求地址]
  * @param {Object} params [参数]
  * @param {string} type [请求的类型] 
  */
export function fetch (url, params, type) {
  if(type === 'post') {
    return post(url, params)
  } else {
    // 默认请求方式
    return get(url, params)
  }
}